作者:cometcui | 来源:互联网 | 2023-08-17 18:35
篇首语:本文由编程笔记#小编为大家整理,主要介绍了UE4学习杂项总结一相关的知识,希望对你有一定的参考价值。
一、前言
学习UE4也有一段时间了,将遇到的问题做了一个汇总,也许对我来说目前这写问题还算是一个知识点,因为其中还有一些基本的操作问题。当然也有一些非常费解的、截至到目前为止我也没有找到解决方法的问题。
二、具体内容
2.1、界面操作BoxBrush
刚创建的BoxBrush在Details中找不到Materials、Physics等属性,无法对材质进行设置,如图2.1.1所示:
图2.1.1 这是因为刚创建的Bush需要转换成StaticMesh才会有上述的属性,点击BrushSetting下的Create StaticMesh后,如图2.1.2所示,会将该Brush保存为一个静态网格到文
图2.1.2 件夹中,并且世界大纲中的Brush也会自动转成StaticMesh,针对StaticMesh的Details是会包含上述的属性的。
2.2、自定义的GameInstance蓝图或类的使用
如果自定义了GameInstance蓝图或类,比如命名为MyGameInstance,一定要在ProjectSetting里设置为自定义的MyGameInstance,如图2.2.1所示,
2.2.1 否则会出现转换问题。如图2.2.2所示,如果不进行图2.2.1的设置,在将系统GameInstance转成MyGameInstance时出现转换失败。
图2.2.2 2.3、每个UI中的组件都可以成为设计视图中的变量
在UI中有两个视图分别为Designer和Graph,在Designer中创建的UI组件在Graph中默认是不能引用的,需要将UI组件的IsVariable勾选方可。如图2.3所示,勾选组件的Is Variable后在Graph视图
图2.3 的Variable/UI下会显示刚刚勾选的组件,此时在定义的方法和事件中可以引用该组件。
2.4、 UI的Text绑定更新问题
如图2.4.1所示,在控件Text上绑定文本更新方法,如果是从这创建的绑定
图 2.4.1 方法会执行,但如果是从这选的一开始创建好的方法,如图中的GetPing方法有可能不执行,这个可能是虚幻4(版本为4.25.4)的Bug。也即一定要从图1.4.1中点击“Create Binging”创建绑定后的处理方法才会被每帧刷新,如果是事先在“Graph”视图中创建好的方法,在图2.4.1中选择后,不会每帧执行。
2.5、如果UI按钮的子部件设置为“Collapse”则整个按钮都会隐藏并且不会占用布局空间
如图2.5.1所示,按钮“DebugDestroySession”的子物体为“TextBlock”,并且
图2.5.1
设置这个子物体的Behavior->visibility为Collapsed,则整个按钮在运行时都会隐藏,并且不占用布局空间。
2.6、Cast To 自定义的GameInstance时失败
在2.2中设置了默认的GameInstance为自定义的MyGameInstance类还是出现转换失败的情况,可以检查下系统的配置文件DefaultEngine.ini里的GameInstanceClass是否为对应的自定义游戏实例名,如图2.6.1所示为出现错误时对应的名字不是我创建的GameInstance名,我创建的游戏实例名字为“MyGameInstance”,将其修改过来即可。比如我创建的“MyGameInstance”蓝图脚本在如图2.6.2所示的文件夹下,则在DefaultEngine.ini里默认GameInstanceClass下面添加一句“GameInstanceClass=/Game/Blueprints/MyGameInstance.MyGameInstance_C”
修改完了之后,一定要重启一下工程才可以使用。
图2.6.1 图2.6.2 2.7、 关卡蓝图的Event BenginPlay不执行
如果关卡Level1的Word Setting中设置了GameMode为自定义的模式,如图2.7.1所示,则从别的关卡进入到该关卡时,如通过Open Level方法加载到Level1关卡时,Level1的关卡蓝图中Event BenginPlay会出现不执行的现象。只需要将GameMode设置为None即可。
图 2.7.1 2.8、 静态网格Sockets属性使用
如图2.8.1所示,帽子的模型可以通过设置其Sockets属性为head而快速放置帽子的位置。
图2.8.1 2.9、新编译或重新打开工程能解决很多问题
比如如图2.9.1所示,同样的两个动画状态,上面的是编译后带帧率条的,下面的就没有。不要觉得奇怪编译一下就可以,如果还是不行,重新打开一下工程。
图2.9.1 2.10、 动画出现重复播发可能需要关闭循环
2.11、蓝图中自定义的事件有Replicate属性而自定义的方法没有
2.12、 User Widget可以作为一个另外一个User Widget的一部分
比如创建了一个User Widget A,并且在A里面有一个容器AC,再创建了一个User Widget B,可以直接将B创建完之后放置到容器AC中,如图2.12.1所示的蓝图,创建完之后使用Add Child方法添加到容器AC中。
图2.12.1 2.13、 纯函数和非纯函数的区别
如图2.13.1所示,在创建函数的属性中有一个Pure的选项,勾选即成为纯函数,反之为非纯函数。纯函数和非纯函数的区别主要有:
图 2.13.1 用途不一样:纯函数通常用于只输出数据值的 getter函数或运算符;调用方式不一样:纯函数不需要执行引脚,非纯函数需要执行引脚,并且是作为输入调用,如图2.13.2的纯函数
图 2.13.2 “SetPlayerNumber”作为蓝图“Cast To MyPlayerState”的输出调用时是不会执行的,必须作为输入时才可以调用,如图 2.13.3所示,当纯函数“SetPlayerNumber”所谓“New Var 0”的输入端调用函数时会执行。也即纯函数连接到数据引脚,当需要依赖它们的数据时,编译器会自动执行它们。
图2.13.4 2.14、在事件图中可以使用Delay方法,在自定义的方法中不能使用
如图2.14.1所示的Delay蓝图方法是在蓝图的事件图章创建的,当复制到方法中时提示不能复制,如图2.14.2所示。这也就意味着Delay只能在事件中使用不能在方法中调用,但是我想要在调用方法后执行一段延迟的功能要如何实现,只能通过方法后面调用自定义的事件了,略显得繁琐了些。有点类似于Unity的协程,单独在方面里面使用yield关键字是无法创建延迟的效果,必须要方法里调用一个新建的协程才能实现。
图2.14.1 图2.14.2
方法中不能调用的方法还有
和Session有关的所有方法,如Create Session、Destroy Session、Find Session等; Timeline方法,但Set Timer by Function Name可以调用 目前总结到的就这么多,后续再补充。
三、总结
整理的都是平时遇到的问题,比较杂乱,不过有些问题还是很有帮助;